Q: Mac OS X 向けに VFS プラグインを開発しました。プラグインは、Mac OS X バージョン 10.2 では問題なく動作しました。しかし、Mac OS X バージョン 10.3 では、ボリュームをアンマウントできません。ルートの vnode に対する余分な参照があるために、アンマウントが EBUSY エラーを出して失敗します。どうしたら直せますか? A: アップルは、Mac OS X バージョン 10.3 "Panther" で変更を加えており、VFS レイヤがボリュームのルート vnode に対して余分な参照を持つようになっています。xxx_unmount vnode 操作(VOP)の実装方法によっては、ボリュームをアンマウントしようとすると、EBUSY エラーが出て失敗することがあります。具体的に言うと、xxx_unmount VOP では、ルート vnode の v_usecount フィールドを調べる前に、vflush を呼び出す必要があります。
たとえば、既存の xxx_unmount VOP がリスト 1 のようになっているとしたら、リスト 2 のようにする必要があります。
リスト 1. xxx_unmount VOP の間違った実装方法。
| if (rootvp->v_usecount > 1 && !(flags & FORCECLOSE)) {
return EBUSY;
}
error = vflush(mp, rootvp, flags);
if (error != 0) {
return error;
} |
リスト 2. xxx_unmount VOP の正しい実装方法。
| error = vflush(mp, rootvp, flags);
if (error != 0) {
return error;
}
if (rootvp->v_usecount > 1 && !(flags & FORCECLOSE)) {
return EBUSY;
} |
この問題の影響としては、ボリューム上で開いているファイルがないのに、ボリュームが使用中に見えるためにアンマウントができないというものです。この問題がボリュームの他の動作に影響を与えることはないはずです。
[2003 年 10 月 23 日]
|